package Queuedemo;

public class MyCircularQueue {
    //定义一个空数组
    public int[] elem;
    //定义两个指针,同时指向头节点
    public int front;
    public int rear;
    //构造器,构造队列长度为k
    public MyCircularQueue(int k) {
        elem = new int[k+1];//X
    }
    //入队操作
    public boolean enQueue(int value) {
        //先判断这个队列是不是满的 , 满的返回false ; 空,则直接插
        if(isFull()){
            return false;
        }else{
            elem[rear] = value;//先往rear位置插入值
            rear = (rear + 1) % elem.length;//然后将rear往后移
            return true;
        }
    }

    //删除队头元素
    public boolean deQueue() {
        if(isEmpty()){
            return false;
        }else{
            //front++;//不能直接++,因为有可能是7到0,0的时候不能1直接用++,所以front可以跟rear一样通过公式前移
            front = (front + 1) % elem.length;
            return true;
        }
    }

    //得到队头元素,不删除
    public int Front() {
        if(isEmpty()){
            return -1;
        }else{
            return elem[front];
        }
    }

    //得到队尾元素,不删除
    public int Rear() {
        if(isEmpty()){
            return -1;
        }else{
            //return elem[rear];//队尾不能直接返回
            //队尾需要看它rear是否等于0,如果是0那么它最后一个元素下标是elem.length - 1
            //如果不等于0,下标就应该是rear - 1 ;
            int index = (rear == 0) ? elem.length - 1 : rear - 1;
            //(rear为7对应的是elem数组下标为6的元素)
            return elem[index];
        }
    }

    public boolean isEmpty() {
        //队列空的标志
        if(front == rear){
            return true;
        }else{
            return false;
        }

    }

    public boolean isFull() {//队列满的标志
        return (rear + 1) % elem.length == front;
    }
}
